home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src.arc / TTYDRIV.C < prev    next >
C/C++ Source or Header  |  1989-03-28  |  2KB  |  120 lines

  1. /* TTY input driver */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "tty.h"
  6.  
  7. static int edit;
  8. static int echo;
  9. #define    OFF    0
  10. #define    ON    1
  11.  
  12.  
  13. #define    LINESIZE    256
  14.  
  15. #define    CTLU    21
  16. #define CTLR    18
  17. #define    CTLZ    26
  18.  
  19. /* Return current TTY status */
  20. int
  21. ttygetmode()
  22. {
  23.     return (edit << 1) | echo;
  24. }
  25. /* Set TTY modes */
  26. void
  27. ttysetmode(x)
  28. int x;
  29. {
  30.     edit = (x & 2) ? 1 : 0;
  31.     echo = x & 1;
  32. }
  33. /* Accept characters from the incoming tty buffer and process them
  34.  * (if in cooked mode) or just pass them directly (if in raw mode).
  35.  * Returns the number of characters available for use; if non-zero,
  36.  * also stashes a pointer to the character(s) in the "buf" argument.
  37.  */
  38.  /*Control-R added by df for retype of lines - useful in Telnet */
  39.  
  40. struct mbuf *
  41. ttydriv(c)
  42. char c;
  43. {
  44.     static struct mbuf *bp;
  45.     struct mbuf *nbp;
  46.     static char *cp;
  47.     char *rp;
  48.  
  49.     switch(edit){
  50.     case OFF:
  51.         if((nbp = alloc_mbuf(1)) == NULLBUF)
  52.             return NULLBUF;
  53.         *nbp->data = c;
  54.         nbp->cnt = 1;
  55.         if(echo)
  56.             putchar(c);
  57.         return nbp;
  58.     case ON:
  59.         if(bp == NULLBUF){
  60.             if((bp = alloc_mbuf(LINESIZE)) == NULLBUF)
  61.                 return NULLBUF;
  62.             cp = bp->data;
  63.         }
  64.         /* Perform cooked-mode line editing */
  65.         switch(c & 0x7f){
  66.         case '\r':    /* CR and LF are equivalent */
  67.         case '\n':
  68.             *cp++ = '\r';
  69.             *cp++ = '\n';
  70.             if(echo)
  71.                 printf("\n");
  72.             bp->cnt = cp - bp->data;
  73.             nbp = bp;
  74.             bp = NULLBUF;
  75.             return nbp;
  76.         case '\b':        /* Backspace */
  77.             if(cp != bp->data){
  78.                 cp--;
  79.                 if(echo)
  80.                     printf("\b \b");
  81.             }
  82.             break;
  83.         case CTLR:    /* print line buffer */
  84.             if(echo){
  85.                 printf("^R\n") ;
  86.                 rp = bp->data;
  87.                 while (rp < cp)
  88.                     putchar(*rp++) ;
  89.             }
  90.             break ;
  91.         case CTLU:    /* Line kill */
  92.             while(cp != bp->data){
  93.                 cp--;
  94.                 if(echo){
  95.                     printf("\b \b");
  96.                 }
  97.             }
  98.             break;
  99.         default:    /* Ordinary character */
  100.             *cp++ = c;
  101.                 
  102. #ifndef    AMIGA
  103.             /* ^Z apparently hangs the terminal emulators under
  104.              * DoubleDos and Desqview. I REALLY HATE having to patch
  105.              * around other people's bugs like this!!!
  106.              */
  107.             if(echo && c != CTLZ && cp < &bp->data[LINESIZE-1])
  108.                 putchar(c);
  109. #endif
  110.             if(cp >= &bp->data[LINESIZE-1]){
  111.                 putchar('\007');    /* Beep */
  112.                 cp--;
  113.             }
  114.             break;
  115.         }
  116.         break;
  117.     }
  118.     return NULLBUF;
  119. }
  120.